package com.huiqiao.lesson9.controller;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

/**
 * 通用控制器基类，用于标准化接口返回格式。
 * 返回结构统一为：{ "code": 200, "message": "操作成功", "data": {...} }
 */
public class BaseController {

    /**
     * 成功 - 无数据
     */
    public AppResponse<Void> success() {
        return new AppResponse<>(200, "操作成功", null);
    }

    /**
     * 成功 - 携带数据
     */
    public <T> AppResponse<T> success(T data) {
        return new AppResponse<>(200, "操作成功", data);
    }

    /**
     * 成功 - 自定义提示信息 + 数据
     */
    public <T> AppResponse<T> success(T data, String message) {
        return new AppResponse<>(200, message, data);
    }

    /**
     * 失败 - 默认提示
     */
    public AppResponse<Void> fail() {
        return new AppResponse<>(500, "操作失败", null);
    }

    /**
     * 失败 - 自定义提示
     */
    public AppResponse<Void> fail(String message) {
        return new AppResponse<>(500, message, null);
    }

    /**
     * 失败 - 自定义状态码 + 提示
     */
    public AppResponse<Void> fail(int code, String message) {
        return new AppResponse<>(code, message, null);
    }

    /**
     * 通用响应封装类
     */
    @Data
    @ApiModel(value = "AppResponse", description = "统一接口响应结果封装")
    public static class AppResponse<T> {

        /**
         * 状态码：200 表示成功，其他表示失败
         */
        @ApiModelProperty(value = "状态码（200表示成功，其他表示错误）", example = "200")
        private int code;
        @ApiModelProperty(value = "提示信息", example = "操作成功")
        private String message;
        @ApiModelProperty(value = "返回数据对象（泛型）")
        private T data;

        public AppResponse(int code, String message, T data) {
            this.code = code;
            this.message = message;
            this.data = data;
        }
    }
}
